<?php

namespace app\common\controller;

use app\api\controller\ApiNotify;
use think\facade\Env;
use think\facade\Request;
use Yansongda\Pay\Pay;

/**
 * 支付宝支付
 */
class AlipayPay
{
  protected $instance = NULL;
  protected $config = [];
  /**
   * 初始化方法
   */
  public  function __construct()
  {
    // 获取当前域名
    $domain = Request::domain();
    // 获取当前协议（http或https）
    $scheme = Request::scheme();
    // 获取当前端口
    $port = Request::port();
    // 如果是非标准端口（80或443），则需要加上端口号
    if ($scheme == 'http' && $port != 80 || $scheme == 'https' && $port != 443) {
      $domain .= ':' . $port;
    }  
    $this->config = [
      'alipay' => [
        'default' => [
          // 必填-支付宝分配的 app_id
          'app_id' => Env::get('ALIPAY.ALIPAY_PAY_APPID'),
          // 必填-应用私钥 字符串或路径
          'app_secret_cert' => Env::get('ALIPAY.ALIPAY_PAY_APP_SECRET_CERT'),
          // 必填-应用公钥证书 路径
          'app_public_cert_path' => app()->getRootPath() . 'public/cert/alipay/' . Env::get('ALIPAY.ALIPAY_PAY_APP_PUBLIC_SECRET_CERT_PATH'), //'/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',
          // 必填-支付宝公钥证书 路径
          'alipay_public_cert_path' => app()->getRootPath() . 'public/cert/alipay/' . Env::get('ALIPAY.ALIPAY_PAY_PUBLIC_CERT_PATH'), //'/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',
          // 必填-支付宝根证书 路径
          'alipay_root_cert_path' => app()->getRootPath() . 'public/cert/alipay/' . Env::get('ALIPAY.ALIPAY_PAY_ROOT_CERT_PATH'), //'/Users/yansongda/pay/cert/alipayRootCert.crt',
          'return_url' => '', //同步回调
          'notify_url' => $domain . '/api/ApiNotify/alipayPayNotify', //'https://yansongda.cn/alipay/notify',
          // 选填-第三方应用授权token
          'app_auth_token' => '',
          // 选填-服务商模式下的服务商 id，当 mode 为 Pay::MODE_SERVICE 时使用该参数
          'service_provider_id' => '',
          // 选填-默认为正常模式。可选为： MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
          'mode' => Pay::MODE_NORMAL,
        ],
      ],
      'logger' => [ // optional
        'enable' => false,
        'file' => $domain . '/paylog/alipay.log',
        'level' => 'debug', // 建议生产环境等级调整为 info，开发环境为 debug
        'type' => 'daily', // optional, 可选 daily.
        'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
      ],
      'http' => [ // optional
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
      ],
    ];
  }

  //退款
  public function orderRefund($order_no, $refund_money)
  {
    Pay::config($this->config);

    $result = Pay::alipay()->refund([
      'out_trade_no' => $order_no,
      'refund_amount' => $refund_money,
      'refund_reason' => '用户退款',
    ]);
    return $result;
  }


  public function miniProPay($money, $order_no, $openid)
  { 
    Pay::config($this->config);

    $result = Pay::alipay()->mini([
      'out_trade_no' => $order_no,
      'total_amount' => $money,
      'buyer_id' => $openid,
      'subject' => '订单支付',
    ]);

    return $result;
  }


  public function notifyCallback()
  {
    Pay::config($this->config);

    try {
      $data = Pay::alipay()->callback(); // 是的，验签就这么简单！ 
      // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
      // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
      // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
      // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
      // 4、验证app_id是否为该商户本身。
      // 5、其它业务逻辑情况

      $apiNotify = new ApiNotify();
      $out_trade_no = $data['out_trade_no'];
      $transaction_id =  $data['notify_id'];
      $payRst = $apiNotify->doNotify($out_trade_no, $transaction_id, $data);
      if ($payRst) {
        return Pay::alipay()->success();
      }
    } catch (\Throwable $e) {
      dd($e);
    }
  }
}
